# @Author   : XiongBinFei
# @Version  : 1.0
# @Time     : 2025/3/12 14:57

# -*- coding: utf-8 -*-
# @Author : XiongBinFei
# @Time   : 2024-03-12

def validate_id(user_id):
    """验证ID合法性"""
    if len(user_id) == 0:
        return False, "ID不能为空"
    if len(user_id) > 8:
        return False, "ID长度不能超过8位"
    for char in user_id:
        if not (char.isalnum() or char == '_'):
            return False, "ID只能包含数字、字母和下划线"
    return True, ""


def validate_email(email):
    """验证邮箱基本格式"""
    if '@' not in email:
        return False, "缺少@符号"

    parts = email.split('@')
    if len(parts) != 2:
        return False, "邮箱格式错误"

    local, domain = parts
    if not local or '.' not in domain:
        return False, "邮箱格式不完整"
    if domain.startswith('.') or domain.endswith('.'):
        return False, "域名格式无效"
    return True, ""


def validate_id_card(id_card):
    """验证身份证基本格式并提取性别"""
    if len(id_card) != 18:
        return False, "身份证号码长度错误", None

    # 验证前17位数字
    if not id_card[:17].isdigit():
        return False, "身份证前17位必须为数字", None

    # 验证最后一位
    last_char = id_card[17].upper()
    if last_char not in ('X', '0', '1', '2', '3', '4', '5', '6', '7', '8', '9'):
        return False, "身份证末位格式错误", None

    # 提取性别（第17位奇数为男，偶数为女）
    gender_num = int(id_card[16])
    gender = "男" if gender_num % 2 else "女"
    return True, "", gender


def validate_name(name):
    """验证中文姓名"""
    if len(name) == 0:
        return False, "姓名不能为空"
    if len(name) > 4:
        return False, "姓名不能超过4个汉字"

    for char in name:
        code = ord(char)
        # 扩展汉字范围检测
        if not (0x4E00 <= code <= 0x9FFF or
                0x3400 <= code <= 0x4DBF or
                0x20000 <= code <= 0x2CEAF):
            return False, "姓名只能包含汉字"
    return True, ""


def main():
    errors = []
    user_info = {}

    # ID验证
    user_id = input("请输入你的ID：").strip()
    is_valid, msg = validate_id(user_id)
    if not is_valid:
        errors.append(msg)
    else:
        user_info['ID'] = user_id

    # 邮箱验证
    email = input("请输入你的EMAIL地址：").strip()
    is_valid, msg = validate_email(email)
    if not is_valid:
        errors.append(msg)
    else:
        user_info['Email'] = email

    # 身份证验证
    id_card = input("请输入你的身份证号：").strip().upper()
    is_valid, msg, gender = validate_id_card(id_card)
    if not is_valid:
        errors.append(msg)
    else:
        user_info['身份证号'] = id_card
        user_info['性别'] = gender

    # 姓名验证
    name = input("请输入你的姓名：").strip()
    is_valid, msg = validate_name(name)
    if not is_valid:
        errors.append(msg)
    else:
        user_info['姓名'] = name

    # 结果输出
    if errors:
        print("\n验证失败：")
        for error in set(errors):
            print(f"* {error}")
    else:
        print("\n注册成功！用户信息：")
        for key, value in user_info.items():
            print(f"{key}: {value}")


if __name__ == "__main__":
    main()


"""
主要优化点：
模块化验证
将每个验证逻辑封装成独立函数
每个验证函数返回验证结果和错误信息
身份证验证函数同时返回性别信息
增强验证逻辑
ID：增加空值检测，使用isalnum()简化判断
邮箱：增加域名格式验证（包含点号检测）
身份证：精确验证长度、数字范围和校验位
姓名：支持扩展汉字区字符检测
错误处理优化
集中收集错误信息
使用集合去重错误提示
统一错误输出格式
用户体验改进
输入自动去除首尾空格
身份证自动转大写处理
性别自动提取功能
验证失败时列出所有错误项
扩展性增强
易于添加新的验证规则
方便扩展其他用户字段
支持国际化（只需修改提示语）
验证规则说明：

ID：1-8位，允许字母数字下划线
邮箱：必须包含@且格式完整
身份证：严格18位，前17位数字，末位X或数字
姓名：1-4个汉字（含扩展汉字）
测试用例建议：

合法ID：test_123
非法邮箱：user@domain（缺少顶级域名）
有效身份证：11010519491231002X
超长姓名：张三四五（5个汉字）
"""